<?php
/*
 * @category 	DefaultController.php
 * @author 		Sung Hoon, Cho (akdddnet@gmail.com)
 * @since		2011. 1. 3.
 * @license		BSD License
 * @version		0.1
 * 
 * 주의 사항!!
 * 자식 클래스가 construct를 가지고 있는 경우 부모클래스의 construct가 암묵적으로 호출되지 않는다. 부모클래스의 construct를 실행하기위해서는 자식
 * 클래스내에서 parent::__construct를 호출 해야됨.
 * 
 * template_랑 연동해야되는데... 이건 생각좀 해봐야될듯.
 */

global $CFG;
require_once $CFG->FW_DIR."/mvc/Controller.php";
require_once $CFG->CLASSES_DIR."/default/FileEB.php";

class DefaultController extends Controller {
	 
	 /**
	  * 생성자 삭제 하시면 안됩니다 ㅠ
	  */
	function __construct() {
		parent::__construct(get_class());	// 꼭 부모의 construct를 실행 해줘야됩니다.
	} 
	
	/**
	 * 해당 모듈에 접근 할때마다 특별한 행위를 해야되는 경우에 작성해주시면 됩니다.
	 * 만약 필요가 없다면 삭제하셔도 무관합니다.
	 * 사용 예) 모든 함수에 특정 권한이 존재하는 경우...
	 *  
	 */
	function start() {
		
	}
	
	
	function index() {
		global $CFG;

		// 기념일 정보
		$anniversary = $this->getAnniversary();
		
		
		$this->tpl->assign(array(	
				"anniversary"=>$anniversary
		));
	}

	private function getAnniversary() {
		
		$anniversary = new stdClass;
		$anniversary->status = array();
		$anniversary->list = array();
		
		$anniversary_list = $this->dao->getAnniversary(new DTO())->list;

		
		if(!Common::isNullOrEmpty($anniversary_list)) {
			foreach($anniversary_list as $list) {
				// main에 출력될 기념일이 3개 이상일 경우 로직 처리하기가 애매하기 때문에
				// main, 일반 기념을 별개로 구분 한 후 다시 기념일 갯수 만큼 반복을 돌아야될듯.
				if($list->ay_main) {
					array_push($anniversary->status, $list);
				} else {
					array_push($anniversary->list, $list);
				}
			}
		}
		
		$anniversary->status = $this->getAnniversarySetting($anniversary->status);
		$anniversary->list = $this->getAnniversarySetting($anniversary->list, 4);
		
		return $anniversary;
		
	}

	private function getAnniversarySetting($anniversary, $count=3) {
		
		$anni = array();
		
		$now = date("Y-m-d");

		// 메인에서 기념일 리스트 출력은.. 무조건 D-day 일자 기준으로 정렬 시킴.
		// 기념일이 동일일이 나타날수 있으므로 배열값 뒤에 숫자를 더 두는게 좋음.
		$i = 0;
		foreach($anniversary as $a) {
			$ay_date_strtotime = strtotime($a->ay_date);
			$ay_date = date("Y-m-d", $ay_date_strtotime);
			 
			switch($a->ay_display) {
				default :
				case 0 :
				case 1 :
					$print_day = 100;
					
					$interval = DateUtil::getDateDiff($ay_date, $now);
					$datetime = new DateTime($ay_date);
					
					
					if($a->ay_display) {
						$datetime = new DateTime($ay_date);
						$ay_date = $datetime->modify("-1 day")->format("Y-m-d");
						
						$a->days = DateUtil::getDateDiffFormat($ay_date, $now);
						
						$days = round($interval->days/100)*$print_day;
						$ay_date = $datetime->add(new DateInterval("P".$days."D"))->format("Y-m-d");
					} else {
						// d-day 날짜가 지났을 경우.
						if($now > $ay_date) {
							$days = round($interval->days/100)*$print_day+($print_day);
							$ay_date = $datetime->add(new DateInterval("P".$days."D"))->format("Y-m-d");
						}
						
						$a->days = DateUtil::getDateDiffFormat($ay_date, $now);
					}
					
					break;
				case 2 :	// 생일
					$getdate = getdate();
					
					// 월,일만 가져오기
					$birth_mon_day = date("m-d", $ay_date_strtotime);
					
					// 금년도 생일.
					$birthday = $getdate["year"]."-".$birth_mon_day;
					
					// 음력일 경우 양력 일자로 가져오기
					if(!$a->ay_is_solar) {
						$birthday = $this->getLunarToSolar($birthday);
					}
					
					// 금년도 생일이 지났으면 birthday를 다음해 생일날로 변경
					if($now > $birthday) {
						$birthday = ($getdate["year"]+1)."-".$birth_mon_day;
						
						// 음력일 경우 양력일자로 가져오기
						if(!$a->ay_is_solar) {
							$birthday = $this->getLunarToSolar($birthday);	
						}
					}
						 
					
					$ay_date = $birthday;

					$a->days = DateUtil::getDateDiffFormat($ay_date, $now);
					break;
			}
			
			
			$a->display_day = $ay_date;
			$anni[$ay_date."-".$i] = $a;

			$i++;
		}
		
		ksort($anni);
		array_splice($anni, $count);
		
		return $anni;
	}
	
	
	private function getLunarToSolar($solar_date) {
		$dto = new DTO();
		$dto->obj = date("Y/m/d", strtotime($solar_date));
		return date("Y-m-d", strtotime($this->dao->getLunarToSolar($dto)->obj->solar_date));
	}
	
	
	function doFileUpload() {
	
		global $CFG;
		require_once $CFG->FW_DIR."/utility/Dir.php";
	
		// HTTP headers for no cache etc
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
		header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
		header("Cache-Control: no-store, no-cache, must-revalidate");
		header("Cache-Control: post-check=0, pre-check=0", false);
		header("Pragma: no-cache");
	
		$temp_dir = $CFG->DATA_DIR."/upload/temp";
	
		$dir = new Dir();
	
		// temp_dir이 존재하지 않을 경우 생성하기
		$dir->mkdir($temp_dir);
	
	
		// Get parameters
		$param = new Parameter(false);
		$chunk = $param->getParameter("chunk", 0);
		$chunks = $param->getParameter("chunks", 0);
		$file_name = $param->getParameter("name", "");
	
		// Clean the fileName for security reasons
		//$file_name = preg_replace('/[^\w\._]+/', '', $file_name);
	
	
		// 파일이 한개씩 전송이 되니깐... 생각을 잘해봐야됨.
		$save_filename = Common::getUUID();
	
		// 확장자 알아오기
		$ext = strtolower(substr(strrchr($file_name,"."), 1));
	
		// 파일 사이즈
		$file_size = 0;
	
	
		// Look for the content type header
		if (isset($_SERVER["HTTP_CONTENT_TYPE"]))
		$contentType = $_SERVER["HTTP_CONTENT_TYPE"];
	
		if (isset($_SERVER["CONTENT_TYPE"]))
		$contentType = $_SERVER["CONTENT_TYPE"];
	
			
		// Handle non multipart uploads older WebKit versions didn't support multipart in HTML5
		if (strpos($contentType, "multipart") !== false) {
			if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
	
				$file_size = $_FILES['file']['size'];
				// Open temp file
				$out = fopen($temp_dir . DIRECTORY_SEPARATOR . $save_filename, $chunk == 0 ? "wb" : "ab");
				if ($out) {
					// Read binary input stream and append it to temp file
					$in = fopen($_FILES['file']['tmp_name'], "rb");
	
					if ($in) {
						while ($buff = fread($in, 4096))
						fwrite($out, $buff);
					} else
					die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
	
					fclose($in);
	
					fclose($out);
					@unlink($_FILES['file']['tmp_name']);
				} else {
					die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
				}
			} else {
				die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
			}
		} else {
			// Open temp file
			$out = fopen($temp_dir . DIRECTORY_SEPARATOR . $save_filename, $chunk == 0 ? "wb" : "ab");
			if ($out) {
				$file_size = $_FILES['file']['size'];
	
	
				// Read binary input stream and append it to temp file
				$in = fopen("php://input", "rb");
	
				if ($in) {
					while ($buff = fread($in, 4096))
					fwrite($out, $buff);
				} else
				die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
	
				fclose($in);
				fclose($out);
			} else
			die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
		}
	
	
		// 여기까지 진행이 됐으면 정상적으로 파일 업로드가 된 경우임.
		// 업로드 된 파일 정보 DB에 입력하기.
		
		$eb = new FileEB();
		$eb->a_filename = $file_name;
		$eb->a_savefilename = $save_filename;
		$eb->a_path = $temp_dir;
		$eb->a_ext = $ext;
		$eb->a_filesize = $file_size;
	
		$dto = new DTO();
		$dto->eb = $eb;
	
		// seq값 가져오기
		$seq = $this->dao->doFileUpload($dto)->obj;
	
	
		// Return JSON-RPC response
		die('{"jsonrpc" : "2.0", "result" : {"seq":'.$seq.'}, "id" : "id"}');
	}
	
}

